#include "http_stream.h"
#include "impl/http_stream_impl.h"


//////////////////////////////////////////////////////////////////////////
//


http_stream::http_stream( std::ostream& err_stream, const std::string& server, const std::string& port /*= "http"*/, size_t trans_bytes_per_once /*= 1024*/ )
	: impl_( new http_stream_impl( err_stream, server, port, trans_bytes_per_once ) )
{}


//////////////////////////////////////////////////////////////////////////
//


http_stream::~http_stream()
{}


//////////////////////////////////////////////////////////////////////////
//


void http_stream::resolve()
{
	impl_->resolve();
}


//////////////////////////////////////////////////////////////////////////
//


std::istream http_stream::responsed_header()
{
	return impl_->responsed_header();
}


//////////////////////////////////////////////////////////////////////////
//


std::istream http_stream::responsed_contents()
{
	return impl_->responsed_contents();
}


//////////////////////////////////////////////////////////////////////////
//


void http_stream::set_write_progress( Progress proc )
{
	impl_->set_write_progress(proc);
}


//////////////////////////////////////////////////////////////////////////
//


http_stream& http_stream::operator<<( std::ostream& (*f)(std::ostream&) )
{
	f(impl_->request_stream_);

	return *this;
}


//////////////////////////////////////////////////////////////////////////
//


http_stream& http_stream::operator<<( const std::string& data )
{
	(*impl_) << data;

	return *this;
}


//////////////////////////////////////////////////////////////////////////
//


http_stream& http_stream::operator<<( int data )
{
	(*impl_) << data;

	return *this;
}


//////////////////////////////////////////////////////////////////////////
//


http_stream& http_stream::operator<<( const http_stream::Bytes& bytes )
{
	if( bytes.empty() == false )
		impl_->request_stream_.write( &bytes[0], bytes.size() );

	return *this;
}


//////////////////////////////////////////////////////////////////////////